package demo1;

abstract class Shape {//抽象类 使用abstra修饰类
    public int a = 10;
    public int b;
    Shape() {

    }

public abstract void draw();//可以不写具体实现
}    //抽象方法
class Rect extends Shape {
    @Override
    public void draw() {
        System.out.println("画矩形");
    }
}
/*abstract class Rect extends Shape {

    }
class A extends Rect {
        @Override
        public void draw() {
            System.out.println("画矩形");
        }
}*/
class Cycle extends Shape {
        @Override
        public void draw() {
            System.out.println("画圆");
        }
    }
class Flower extends Shape {
        @Override
        public void draw() {
            System.out.println("画❀");
        }
    }
    /*public void fun() {
    //非抽象方法
    }*/

public class Test {
    public static void drawMap1(Shape shape) {
        shape.draw();
    }
    public static void main(String[] args) {
        //Shape shape = new Shape();抽象类不能被实例化
        drawMap1(new Rect());
        drawMap1(new Cycle());
        drawMap1(new Flower());
        Shape shape = new Rect();
    }
}
//1.抽象类使用abstract修饰类
//2.抽象类不能被实例化
//3.此时在抽象类当中，可以有抽象方法或者非抽象方法
//4.抽象方法就是一个方法被abstract修饰，没有具体的实现。只要包含抽象方法，这个类必须是抽象类
//5.当一个普通类继承了抽象类，必须重写抽象类当中的抽象方法
//6.抽象类存在的最大意义就是为了被继承
//7.抽象方法不能被private，final，static。一定要满足重写的规则
//8.当一个子类没有重写抽象的父类方法，可以把当前子类变成abstract修饰
//9.当再次被继承，一定要重写方法
//10.抽象类中不一定包含抽象方法
//